#ifndef __COMMON_HPP__
#define __COMMON_HPP__

#include <cstdio>
#include <cstdlib>
#include <climits>
//#include <ctypes.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <getopt.h>

#include <iostream>
#include <string>
#include <sstream>
#include <map>
#include <set>

#include "utils/utils.hpp"
#include "ipc/ipc.hpp"

typedef size_t cliente_id;
typedef size_t entrenador_id;
typedef size_t aparato_id;

#define MAX_APARATOS 10
#define MAX_ENTRENADORES 10

#include "monitor_reservas.hpp"
#include "monitor_aparatos.hpp"

//enum ePerfil { NINGUNO = 0, JOVEN, ADULTO, ANCIANO, BOXER, TREKING };

//typedef struct {
//	cliente_id id;
//	enum ePerfil perfil;
//	char nombre[40];
//} sCliente;

#ifndef PERMITS
	#define PERMITS 0666
#endif

// Cuantos microsegundos son un segundo (para usleep)
static const size_t SEGUNDO = 1000; //1000000;
static const size_t MINUTO = 60*SEGUNDO;
static const size_t HORA = 60*MINUTO;
static const size_t TURNO = 8*HORA;
static const size_t MEDIO_TURNO = TURNO/2;

static const size_t RUTINA_MINIMA = 2;
static const size_t RUTINA_RANGO = 3;

// Fución para el calculo de la duración asignada a una rutina.
inline size_t calcular_duracion() {
	return RUTINA_MINIMA + rand()%RUTINA_RANGO;
}

// Función de utilidad para generar rutinas.
enum eRutina rutina_al_azar() {
	int aux =  rand() % (ERUTINAS_SIZE-1);
	
	switch (aux) {
		case 1: return ABDOMINALES;
		case 2: return SENTADILLAS;
		case 3: return LAGARTIJAS;
		case 4: return PESAS_FUERZA;
		case 5: return PESAS_REPETICION;
		default: return INDEFINIDA;
	}
}

typedef struct {
	long tipo;
	long origen;
	char data;
} sMensaje;

typedef struct {
	long tipo;
	long origen;
	aparato_id aparato;
	enum eRutina id;
	size_t minutos;
} sRutina;

static utils::logger_stream logger (stdout);
static utils::logger_stream error (stdout,' ',"\033[1;31m");
//static utils::no_log logger;

#define nl utils::nl

#endif /* __COMMON_HPP__ */

